// 获取初始化供货信息表格数据
const getInitTableDataBySupplyInfo = (list) => {
  return list.map(item => ({
    ...item,
    // 供货单位（优先取supplyGoodsUnit，其次取unitName；多供进价多计量有supplyGoodsUnit，单计量没有）
    unitName: item.supplyGoodsUnit || item.unitName,
    factoryCode: '', // 厂家商品代码
    factoryName: '', // 厂家商品名称
    minOrderGoodsNum: undefined, // 最小订货量
    warrantyStatus: '', // 是否保修
    warrantyDay: undefined, // 保修天数
    exchangeGoodsStatus: '', // 是否可换货
    exchangeGoodsDay: undefined, // 换货天数
    exchangeGoodsCondition: '', // 换货条件
    returnGoodsStatus: '', // 是否可退货
    returnGoodsDay: undefined, // 退货天数
    returnGoodsCondition: '', // 退货条件
    minReOrExNum: undefined, // 最小退换货量
    minSaleImperfectionsNum: undefined, // 商品销售最小残品值
    productPacking: '', // 商品包装
    otherPromise: '', // 其他服务承诺
  }));
}

/**
 * 获取初始化供价单计量表格数据
 * @param {* 初始数据集合} list Array
 * @param {* 税类相关信息} taxRateInvoiceInfo Object
 * @param {* 供货价格方式} purchasePriceType String
 * @returns 多供进价数据 Array
 */
const getInitSingleTableDataBySupplyPrice = (list, taxRateInvoiceInfo, purchasePriceType) => {
  return list.map(item => ({
    ...item,
    purchasePriceType, // 供价类型
    freightRatio: 0, // 运费比例或金额
    packRatio: 0, // 包装比例或金额
    processChargesRatio: 0, // 加工费比例或金额
    rebateRatio: 0, // 返利折合比例或金额
    mainUnitCostPrice: 0, // 成本价
    mainPurchasePrice: 0, // 主计量进价
    ...taxRateInvoiceInfo, // 税率相关信息
  }));
}

/**
 * 获取初始化供价多计量表格数据
 * @param {* 初始数据集合} list Array
 * @param {* 税类相关信息} taxRateInvoiceInfo Object
 * @param {* 供货价格方式} purchasePriceType String
 * @returns 多供进价数据 Array
 */
const getInitMultipleTableDataBySupplyPrice = (list, taxRateInvoiceInfo, purchasePriceType) => {
  return list.map(item => ({
    ...item,
    purchasePriceType, // 供价类型
    mainPurchasePrice: 0, // 主计量进价
    freightRatio: 0, // 运费比例或金额
    packRatio: 0, // 包装比例或金额
    processChargesRatio: 0, // 加工费比例或金额
    rebateRatio: 0, // 返利折合比例或金额
    actualConvertRatioCostPrice: 0, // 实际转换率辅计量成本价
    theoryConvertRatioCostPrice: 0, // 理论转换率辅计量成本价
    mainUnitCostPrice: 0, // 成本价
    ...taxRateInvoiceInfo, // 税率相关信息
  }));
}

/**
 * 获取初始化导入后的多供进价表格数据
 * @param {* 导入获取的初始数据} list Array
 * @param {* 税类相关信息} taxRateInvoiceInfo Object
 * @param {* 进价计算方法} handleRowChange Function
 * @returns 多供进价数据 Array
 */
const getInitTableDataByPurchaseImport = ({ list, taxRateInvoiceInfo, handleRowChange }) => {
  return list.map(item => {
    const row = { ...formatPurchaseItem(item), ...taxRateInvoiceInfo };
    handleRowChange(row);
    return row;
  });
}

/**
 * 初始化参照城市设置弹框表格数据
 * @param {* 接口获取的参照城市集合} list Array
 * @returns 设置参照弹框的表格数据 Array
 */
const getInitReferCityTableDataBySetDialog = (list) => {
  // 由于接口替换，返回字段变更，为不影响原有功能，在此初始化一次城市信息数据
  const getReferCitiesInfo = cityInfo => {
    return {
      areaCode: cityInfo?.areaCode, // 业务区域编码
      areaName: cityInfo?.areaName, // 业务区域名称
      saleCityNo: cityInfo?.cityCode, // 销售区域编码
      saleCityName: cityInfo?.cityName, // 销售区域名称
      saleProvinceNo: cityInfo?.provinceCode, // 销售省编码
      saleProvinceName: cityInfo?.provinceName, // 销售省名称
    }
  }
  return list.map(item => ({
    ...getReferCitiesInfo(item),
    isSupply: '', // 是否供货
    buyPriceRatio: 1, // 进价比例
    costPriceRatio: 1, // 成本价比例
    templateCityName: '', // 参照城市名称
    templateCityUuid: '', // 参照城市uuid
  }));
}

/**
 * 获取参照城市设置弹框-批量设置城市下拉集合
 * @param {* 设置完成的参照城市集合} list Array
 * @returns 批量设置城市下拉集合 Array
 */
const getBatchCityOptions = (list) => {
  return list.map(item => ({
    value: item.cityCode,
    label: item.cityName
  }));
}

/**
 * 获取参照城市设置弹框表格数据
 * @param {* 设置完成的参照城市集合} list Array
 * @param {* 当前关联供应商uuid} supplyUuid String
 * @returns 参数处理后的参照城市集合 Array
 */
const getCitiesBySetReferRelation = (list, supplyUuid) => {
  console.log(list);
  const omitCityKeys = ['uuid', 'productUuid', 'productName', 'spuNo']
  const cities = list.map(item => ({
    ..._.omit(item, omitCityKeys),
    supplyUuid,
    saleProvinceUuid: item.saleProvinceNo,
    saleCityUuid: item.saleCityNo,
    isMainSupply: item.isSupply
  }));
  return cities
}

/**
 * 获取设置参照城市后的区域价格表格数据
 * @param {* 当前供价表格初始关联数据集合} unifiedList Array
 * @param {* 当前参照城市集合} referenceCities Array
 * @returns 区域价格表格数据 Array
 */
const getAreaTableDataBySetReferCity = (unifiedList, referenceCities) => {
  return unifiedList.reduce((value, item) => {
    referenceCities.forEach(city => {
      value.push({
        ...item,
        ...formatPurchaseItem(city),
      });
    });
    return value;
  }, []);
}

/**
 * 格式化进价
 * @param {*} item
 * @returns Object
 */
const formatPurchaseItem = item => ({
  ...item,
  templateCitySaleAreaNo: item.saleAreaUuid, // 业务区域编码
  templateCitySaleAreaName: item.saleAreaName // 业务区域名称
});

/**
 * 获取提交入参（之一） - supplyAreaPriceParams
 * @param {* 当前多供进价表格数据} purchaseTable Array
 * @param {* 当前供货价格方式} purchasePriceType String
 * @param {* 当前供应商信息} supplyInfo Object
 * @param {* 默认参照城市数据（仅统一进价有）} defaultReferenceCity Object
 * @param {* 是区域进价} isAreaPurchase Boolean
 * @returns supplyAreaPriceParams Array
 */
const getSupplyAreaPriceParams = ({
  purchaseTable, purchasePriceType, supplyInfo,
  defaultReferenceCity, isAreaPurchase
}) => {
  return purchaseTable.map(item => {
    const submits = {
      ...item,
      isMainSupply: '1', // 区分是否是多供
      purchasePriceType,
      supplyUuid: supplyInfo.supplierCode,
      supplyName: supplyInfo.supplierName,
    }
    if (isAreaPurchase) { // 区域进价
      return submits;
    }
    return {
      ...submits,
      templateCityUuid: defaultReferenceCity.templateCityUuid,
      templateCityName: defaultReferenceCity.templateCityName
    }
  });
}

/**
 * 获取提交入参（之一） - supplyProductRelDTOS
 * @param {* 多供进价表格数据} supplyAreaPriceParams Array
 * @param {* 是否多计量，1为多计量，2为单计量} isPurchaseMultiUnit String
 * @param {* 当前供货价格方法} supplyPriceType String
 * @param {* 默认参照城市信息} defaultReferenceCity Object
 * @param {* 设置后的参照城市列表} supplyAreaParams Array
 * @param {* 多供信息表格数据} infoTable Array
 * @param {* 提交UUID - 唯一标识} commitUuid String
 * @param {* 当前供应商信息} supplyInfo Object
 * @param {* 是区域进价} isAreaPurchase Boolean
 * @param {* 提交原因} launchReason String
 * supplySkuRels - 供货信息表格数据
 * @returns 提交入参 Object
 */
const getSubmitParamsByMoreSupply = ({
  supplyAreaPriceParams, isPurchaseMultiUnit,
  supplyInfo, supplyAreaParams, infoTable, defaultReferenceCity,
  commitUuid, launchReason, supplyPriceType, isAreaPurchase
}) => {
  const supplyUuid = supplyInfo.supplierCode;
  const params = {
    supplyPriceType,
    supMainCategoryName: supplyInfo.supMainCategoryName,
    supMainCategoryId: supplyInfo.supMainCategoryId,
    whoPayFreight: supplyInfo.freightPayer,
    supManagerHrAreaName: supplyInfo.supManagerHrAreaName,
    supplyUuid,
    supplyName: supplyInfo.supplierName,
    isPurchaseMultiUnit,
    supplyAreaParams,
    supplyAreaPriceParams,
    supplySkuRels: infoTable.map(item => ({ ...item, supplyUuid })),
    commitUuid,
    launchReason
  }
  if (isAreaPurchase) { return params; }
  return {
    ...params,
    defaultTemplateCityUuid: defaultReferenceCity?.templateCityUuid,
    defaultTemplateCityName: defaultReferenceCity?.templateCityName
  }
}

/**
 * 获取含所有错误信息的表格数据
 * @param {* 数据集合} list Array
 * @param {* 错误信息} errInfo Object
 * @returns 表格数据 Array
 */
const getTableDataByHasErrMsgs = (list, errInfo) => {
  return list.map(item => {
    // sku+参照城市确定唯一
    const errMsg = errInfo[`${item.skuNo}_${item.templateCityUuid || null}`] || '';
    if (errMsg) { return { ...item, errMsg } }
    return item;
  });
}

/**
 * 获取供应商信息
 * @param {* 数据源} source Object
 * @returns supplyInfo Object
 */
const getSupplyInfo = (source) => {
  const {
    supplyUuid,
    supplyName,
    supMainCategoryId,
    supMainCategoryName,
    supManagerHrAreaName,
    whoPayFreight
  } = source;
  return {
    supplierName: supplyName,
    supplierCode: supplyUuid,
    freightPayer: whoPayFreight,
    supMainCategoryId,
    supMainCategoryName,
    supManagerHrAreaName,
  }
}

/**
 * 获取按维度过滤的唯一集合数据
 * @param {* 要处理的数据集合} list Array
 * @param {* 维度key} dimensionKey String
 * @returns List 唯一集合
 */
const getUniqLisByDimension = (list, dimensionKey = 'skuNo') => {
  return _.uniqBy(_.cloneDeep(list), dimensionKey).map(item => {
    item.templateCityName = ''; // 参照城市名称
    item.templateCityUuid = ''; // 参照城市编码
    item.templateCitySaleAreaName = ''; // 业务区域名称
    item.templateCitySaleAreaNo = ''; // 业务区域编码
    return item;
  });
}

/**
 * 获取异常信息表列
 * @param {* 表列名称} title String
 * @param {* 表列key} key String
 * @returns 异常表列 Object
 */
const getErrMsgColumnInfo = (title, key = 'errMsg') => {
  return {
    title,
    key,
    fixed: 'left',
    sortable: true,
    errorTip: true,
    notShowTip: true
  }
}

export default {
  getInitTableDataBySupplyInfo,
  getInitSingleTableDataBySupplyPrice,
  getInitMultipleTableDataBySupplyPrice,
  getInitTableDataByPurchaseImport,
  getInitReferCityTableDataBySetDialog,
  getBatchCityOptions,
  getCitiesBySetReferRelation,
  getAreaTableDataBySetReferCity,
  getSupplyAreaPriceParams,
  getSubmitParamsByMoreSupply,
  getTableDataByHasErrMsgs,
  getSupplyInfo,
  getUniqLisByDimension,
  getErrMsgColumnInfo
}
